package com.lotusfall.s03;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 *  此类为切面类，包含各种切面方法
 */
@Aspect
@Component
public class MyAround {
    /**
     * 所有切面的功能都是由切面方法来实现的
     * 可以将各种切面都在此类中进行开发
     * <p>
     * 环绕通知的切面方法的规范：
     * 1）访问权限是public
     * 2）方法的返回值是目标方法的返回值
     * 3）方法名称自定义
     * 4）方法有参数，此参数就是目标方法
     * 5）必须使用@Aspect注解来声明切入的时机和功能
     * 回避异常Throwable
     * 参数：value：指定切入点表达式
     *
     * @return
     */
    @Around(value = "mycut()")
    public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("切面方法中的前置通知功能实现……");
        Object obj = pjp.proceed(pjp.getArgs());
        System.out.println("切面方法中的后置通知功能实现^");
        return obj.toString().toUpperCase();
    }
    @Pointcut(value = "execution(* com.lotusfall.s03.*.*(..))")
    public void mycut(){}

}
